Linux Kernel

https://velog.io/@markyang92/kernel
토발즈 리눅스 릴리스
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

장기(long term) 안정화 버전 리눅스 릴리스
git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
Linux(kernel)
- arch
아키텍처별 파일들(아키텍처 별로 서브 디렉토리 구성)
- Documentation
커널 문서
- drivers
장치들에 대한 드라이버(드라이버 별로 서브 디렉토리 구성)
- fs
파일시스템 코드
- include
커널 헤더 파일(툴체인 빌드용 포함)
- init
커널 시작 코드
- kernel
스케줄링, 잠금(locking), 타이머, 전원 관리, 디버깅/추적(trace) 코드 등 핵심 기능
- mm
메모리 관리
- net
네트워크 프로토콜 포함
- scripts
장치 트리 컴파일러등 여러 스크립트 포함
- tools
리눅스 성능 카운터 도구 등 포함
make dep    : 소스 파일과 헤더와의 의존성 검사 -> .depend 생성
make moduels    : module로 설정("m")을 목적파일(*.o) 형태로 생성
make bzImage    : 커널 자체를 생성(커널 크기가 큰 경우 zImage로 생성이 안됨)
make modules_install    : 생성된 module을 /lib/modules/<버전> 에 설치해줌 (depmod를 실행해 module간의 의존성도 생성)
커널 빌드
.config 파일이 있어야 빌드할 수 있음

make menuconfig를 이용해서 .config 생성
make ARCH=<arch> CROSS_COMPILE=<tool-chain prefix> menuconfig

make ARCH=arm CROSS_COMPILE=arm-cortex_a8-linux-gnueabihf- menuconfig

소스트리 청소
make clean    대부분의 중간 파일 제거(.o 파일과 대부분의 중간 파일)
make mrproper    모든 중간 파일(.config 파일 포함) 제거
make distclean    make mrproper+편집기 백업파일, 패치파일, 기타 소프트웨어 생성 파일등 모두 제거
Kconfig(구성 메커니즘)
Documentation/kbuild/

Kconfig을 토대로 .config 파일을 생성한다(make)
make ARCH=arm CROSS_COMPILE=arm-cortex_a8-linux-gnueabihf- menuconfig
(menuconfig or xconfig or gconfig)
Kbuild(Kconfig에 통합된 빌드 시스템)
obj-y += mem.o random.o
obj-$(CONFIG_TTY_PRINTK) += ttyprintk.o
obj-y 와 같이 "y"로 설정된 값은 무조건 내장 요소로 컴파일 됨(의도됨)
obj-$(VARIANCE)는 VARIANCE 가 y이면 내장요소로, m이면 모듈로 빌드된다.

빌드 시, vmlinux(ELF 바이너리)와 System.map이 생성됨
arm-cortex_a8-linux-gnueabihf-size vmlinux    # size 같은 기타 ELF 바이너리 도구 사용 가능
커널 이미지 종류
- U-Boot: 전통적으로 U-Boot는 uImage를 요구하지만, 최근 bootz명령을 통해 zImage 이미지 파일을 로드할 수 있음
- x86 타깃: bzImage 파일
- 기타 대부분의 부트로더: zImage 파일

zImage 빌드
make -j 4 ARCH=arm CROSS_COMPILE=arm-cortex_a8-linux-gnueabihf- zImage    # j는 병렬로 수행할 프로세스 수
uImage 빌드
(uImage를 빌드할 때 플랫폼마다 물리 메모리 주소와 커널의 재배치 주소가 다를 수 있음)
make -j 4 ARCH=arm CROSS_COMPILE=arm-cortex_a8-linux-gnueabihf- LOADADDR=0x80008000 uImage

- Image
가공되지 않은 바이너리(binary)형식으로 변환된 vvmlinux
- zImage
파워PC Arch: 압축된 Image 파일로 부트로드가 압축 해제해야 함
다른 Arch: 압축된 Image와 압축 해제 및 재배치(relocate) 코드
- uImage
zImage와 64바이트 U-boot 헤더
장치 트리 빌드
make ARCH=arm dtbs

*.dtb 파일들은 소스와 같은 디렉토리에 생성됨
모듈 컴파일
일부 모듈로 빌드하도록 구성된 코드들이 있을 경우, modules 타깃으로 독립적으로 빌드
make -j 4 ARCH=arm CROSS_COMPILE=arm-cortex_a8-linux-gnueabihf- modules

*.ko 파일은 소스 코드와 같은 디렉토리에 생성됨
Kernel Compile For Bigle Bone Black(BBB)
cd ~/embeddedSys/linux-stable
make ARCH=arm CROSS_COMPILE=arm-cortex_a8-linux-gnueabihf- mrproper
make ARCH=arm multi_v7_defconfig
make ARCH=arm versatile_defconfig
make -j 4 ARCH=arm CROSS_COMPILE=arm-cortex_a8-linux-gnueabihf- modules
make ARCH=arm CROSS_COMPILE=arm-cortex_a8-linux-gnueabihf- dtbs
초기 사용자 공간
커널 초기화 과정에서 사용자 공간을 제공하기 위해 커널은 루트 파일 시스템을 마운트하고
루트 파일시스템에 있는 프로그램을 실행할 수 있어야 한다.

루트 파일 시스템이 없이 커널이 부팅되는 경우 커널 패닉 발생

init/main.c 에 이를 처리하기 위한 코드가 있음(rest_init()을 통해 시작)
(PID가 1인 첫 번째 스레드를 생성하고 kernel_init()를 실행함)

/init를 찾아서 실행하는데 실패하면, init/do_mount.c 의 prepare_namespaces()을 이용해 파일 시스템을 마운트함
root=/dev/< >< >
root=/dev/< >p< >
성공적으로 마운트 된 이후, /sbin/init, /etc/init, /bin/init, /bin/sh를 성공할 때까지 차례로 실행 시도
( 램 디스크의 경우 rdinit=, 파일 시스템의 경우 init= )
Kernel Message(printk)
Macroprioirty(value)Description
KERN_EMERG0시스템 사용 불능
KERN_ALERT1즉시 조치를 취해야한다.
KERN_CRIT2위급 상태
KERN_ERR3에러 상태
KERN_WARNING4경고 상태
KERN_NOTICE5정상이지만 중요한 상태
KERN_INFO6정보
KERN_DEBUG7디버그 수준 메시지
커널 메시지는 먼저 버퍼(__log_buf)에 저장되며, 이를 출력하는 명령어가 dmesg
버퍼의 크기는 2의 $CONFIG_LOG_BUF_SHIFT 승

메시지 수준이 콘솔 로그 수준 보다 작은 경우 로그 버퍼와 콘솔에도 출력된다.
(default 콘솔 로그 수준 7로 6 이하는 모두 출력과 버퍼 기록 동시 수행됨)

loglevel=<수준>
dmesg -n <수준>
을 이용해서 콘솔 로그 수준을 변경
#include <linux/kernel.h>
printk(KERN_INFO, "System OK\n");
printk("<6>", "System OK\n");
printk("<6>System OK\n");
klogd: 커널에서 발생하는 메시지를 기록 및 관리
syslogd: 커널에서 발생하는 메시지와 응용 프로그램에서 요청한 시스템 정보를 기록하고 관리
/var/log/messages 파일에 모든 커널 메시지가 기록된다.

cat /proc/kmsg 혹은 dmesg를 통해 커널 버퍼의 상태로 바로 확인할 수 있다.